import time
import json
from datetime import datetime, date
import mss
import pygetwindow as gw
import cv2
import pytesseract
import numpy as np
import os
import requests

pytesseract.pytesseract.tesseract_cmd = r'H:\Tesseract-OCR\tesseract.exe'  # 注意：使用 raw string (r'') 或

# 设置要截图的窗口标题（部分匹配即可）
WINDOW_TITLE = "image.png"  # 改为你想截图的窗口标题，比如微信、QQ等
DATE = datetime.now().strftime("%Y-%m-%d")
SAVE_FOLDER = fr"H:\\JieTu\\{DATE}"  # 保存路径（可自定义）
DATA_URL="http://10.10.0.54:9998/jietu/data"
# 创建保存目录（如果不存在）
os.makedirs(SAVE_FOLDER, exist_ok=True)

def capture_window(window_title, save_path):
    # 查找所有匹配的窗口（支持模糊匹配）
    windows = gw.getWindowsWithTitle(window_title)
    if not windows:
        print(f"[{datetime.now()}] 未找到标题包含 '{window_title}' 的窗口")
        return

    window = windows[0]  # 取第一个匹配的窗口
    if window.isMinimized:
        print(f"[{datetime.now()}] 窗口已最小化，跳过截图")
        return

    print(f"[{datetime.now()}] 正在截图窗口: {window.title}")

    # 获取窗口位置和尺寸
    left, top, width, height = window.left, window.top, window.width, window.height

    # 使用 mss 进行区域截图
    with mss.mss() as sct:
        monitor = {"top": top, "left": left, "width": width, "height": height}
        screenshot = sct.grab(monitor)

        # 保存为 png 文件
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"screenshot_{timestamp}.png"
        output_path = os.path.join(save_path, filename)
        mss.tools.to_png(screenshot.rgb, screenshot.size, output=output_path)
        print(f"截图已保存至: {output_path}")
        info = ocrImage(output_path)
        sendData(info)

def sendData(info:dict):
    append_dict_to_txt(info)
    response = requests.get(DATA_URL, params=info)

def ocrImage(image_path) -> dict:
    # 指定要识别的区域坐标 (x, y, width, height)
    # x, y 是左上角坐标
    # width, height 是区域的宽和高
    roi_x, roi_y, roi_width, roi_height = 1680, 335, 50, 23  # 示例坐标
    roi_x1, roi_y1, roi_width1, roi_height1 = 1810, 438, 50, 23  # 示例坐标

    # --- 步骤 1: 加载图像 ---
    image = cv2.imread(image_path)
    if image is None:
        raise FileNotFoundError(f"无法加载图像: {image_path}")

    # --- 步骤 2: 提取指定区域 (ROI) ---
    roi = image[roi_y:roi_y + roi_height, roi_x:roi_x + roi_width]
    roi1 = image[roi_y1:(roi_y1 + roi_height1), roi_x1:(roi_x1 + roi_width1)]

    # --- 步骤 3: (可选) 对ROI进行预处理以提高OCR准确性 ---
    # 转换为灰度图
    gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    gray_roi1 = cv2.cvtColor(roi1, cv2.COLOR_BGR2GRAY)

    # 二值化 (可选，根据图像质量调整)
    # _, binary_roi = cv2.threshold(gray_roi, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    # 或者使用自适应阈值
    # binary_roi = cv2.adaptiveThreshold(gray_roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

    # 去噪 (可选)
    # denoised_roi = cv2.medianBlur(gray_roi, 3)

    # 放大图像 (可选，有时对小字体有帮助)
    # scale_factor = 2
    # enlarged_roi = cv2.resize(denoised_roi, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)

    # 在这个例子中，我们使用灰度图
    preprocessed_roi = gray_roi
    preprocessed_roi1 = gray_roi1

    # --- 步骤 4: 使用Tesseract进行OCR识别 ---
    # 可以设置OCR配置参数
    # 例如: '--psm 6' (假设为单个均匀文本块), '--oem 3' (使用LSTM OCR引擎)
    # 'lang' 参数指定语言，例如 'chi_sim' (简体中文), 'eng' (英文), 'chi_sim+eng' (中英文)
    config = '--psm 6 --oem 3 -l eng'  # 根据需求调整
    # config = '--psm 6 --oem 3 -l chi_sim+eng'  # 识别中英文

    text = pytesseract.image_to_string(preprocessed_roi, config=config)
    text1 = pytesseract.image_to_string(preprocessed_roi1, config=config)

    # 清理结果 (去除换行符、多余空格等)
    recognized_text = text.strip()
    recognized_text1 = text1.strip()

    # --- 步骤 5: 输出结果 ---
    print(f"在区域 ({roi_x}, {roi_y}, {roi_width}, {roi_height}) 内识别到的文本:")
    print(recognized_text)

    print(f"在区域 ({roi_x1}, {roi_y1}, {roi_width1}, {roi_height1}) 内识别到的文本:")
    print(recognized_text1)

    return {
        "total": recognized_text,
        "max": recognized_text1
    }

    # --- (可选) 可视化 ---
    # 在原图上绘制ROI区域
    # cv2.rectangle(image, (roi_x, roi_y), (roi_x + roi_width, roi_y + roi_height), (0, 255, 0), 2)
    # cv2.putText(image, "ROI", (roi_x, roi_y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 在原图上绘制ROI区域
    # cv2.rectangle(image, (roi_x1, roi_y1), (roi_x1 + roi_width1, roi_y1 + roi_height1), (0, 255, 0), 2)
    # cv2.putText(image, "ROI", (roi_x1, roi_y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 显示原图和ROI
    # cv2.imshow('Original Image with ROI', image)
    # cv2.imshow('Extracted ROI', preprocessed_roi)
    # cv2.imshow('Extracted ROI1', preprocessed_roi1)

    # cv2.waitKey(0)
    # cv2.destroyAllWindows()

    # save_dir = r'H:\py\image'
    # if not os.path.exists(save_dir):
    #     os.makedirs(save_dir)
    # --- (可选) 保存处理后的图像 ---
    # cv2.imwrite('H:\\py\\image\\output_with_roi.jpg', image)
    # cv2.imwrite('H:\\py\\image\\extracted_roi.jpg', preprocessed_roi)
    # cv2.imwrite('H:\\py\\image\\extracted_roi1.jpg', preprocessed_roi1)


def append_dict_to_txt(data_dict, filename='data.txt'):
    """
    将字典数据以指定格式追加写入到本地txt文件中。

    参数:
    data_dict (dict): 要写入的字典数据。
    filename (str): 目标txt文件的路径和名称。
    """
    # 获取当前时间，格式化为 'YYYY-MM-DD HH:MM:SS'
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # 将字典转换为JSON字符串
    # ensure_ascii=False 保证中文等非ASCII字符能正常显示
    # separators=(',', ':') 去掉默认的空格，使输出更紧凑（可选）
    json_str = json.dumps(data_dict, ensure_ascii=False, separators=(',', ':'))

    # 构建要写入的完整行
    line = f"{current_time} 抓取数据内容为 : {json_str}\n"

    # 以追加模式 ('a') 打开文件，并写入内容
    # encoding='utf-8' 确保能正确处理中文
    with open(filename, 'a', encoding='utf-8') as file:
        file.write(line)


if __name__ == "__main__":
    print("开始定时截图任务（每5分钟一次），按 Ctrl+C 停止...")
    try:
        while True:
            capture_window(WINDOW_TITLE, SAVE_FOLDER)
            time.sleep(10)  # 5分钟 = 300秒
    except KeyboardInterrupt:
        print("\n任务已停止。")
